package Camera;

import javax.vecmath.Vector3d;

public class PinHoleCamera extends Camera {
	private double hfov;
	private double vfov;
	private double aspect;
	private Vector3d topLeft; /* vector que representa la esquina superior izquierda del plano focal de la camara */
	
	public PinHoleCamera(Vector3d eye, Vector3d target, Vector3d up, double hfov, double vfov, double aspect) {
		super(eye, target, up);
		
		if (hfov < 0) {
			throw new IllegalArgumentException("Horizontal Fov should be greater than 0");
		}
		
		if (aspect < 0) {
			throw new IllegalArgumentException("Aspect ratio should be greater than 0"); 
		}
		
		if (vfov < 0) {
			throw new IllegalArgumentException("Vertical Fov should be greater than 0");
		}
		
		this.hfov = hfov;
		this.vfov = vfov;
		this.aspect = aspect;
		
		calcTopLeft();
	}
	
	public double getHfov() {
		return hfov;
	}

	public void setHfov(double hfov) {
		this.hfov = hfov;
	}

	public double getVfov() {
		return vfov;
	}

	public void setVfov(double vfov) {
		this.vfov = vfov;
	}

	public double getAspect() {
		return aspect;
	}

	public Vector3d getTopLeft() {
		return topLeft;
	}

	private void calcTopLeft() {
		double fphlen, fpvlen; // focal plane horizontal y vertical length
		Vector3d left, auxup;
		
		/* focal plane length: Tan ang = Opuesto / Adyacente, se despeja el Opuesto y se obtiene 1/2 horizontal focal plane length (horizontal o vertical segun se use hfov o vfov */
		fphlen = Math.tan(this.hfov/2) * this.getCameraVector().length();
		fpvlen = Math.tan(this.vfov/2) * this.getCameraVector().length();
		
		left = new Vector3d(this.getRight());
		left.negate(); /* invierte el sentido del vector right para que sea left */
		
		/* como right estaba normalizado, el modulo era unitario, si lo escalamos 1/2 longitud horizontal del plano focal
		 * obtenemos un vector que al sumarlo al cameraVector, posiciona correctamente la componente horizontal del vector topLeft
		 */
		left.scale(fphlen); 
		this.topLeft.add(left);
		
		auxup = new Vector3d(this.getUp());
		
		/* idem que con el izquierdo, pero para desplazarlo hacia el eje (+y) hacia la esquina topLeft */
		auxup.scale(fpvlen);
		this.topLeft.add(auxup);
		
		auxup = null;
	}
}
